#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<time.h>

//全局变量
int high,width;//游戏画面尺寸
int bird_x,bird_y;//小鸟位置 
int bar_y,bar_xtop,bar_xdown; //障碍位置 
int score;            //得分 

int gotoxy(int x,int y)//光标移动到（x，y） 位置 
{
	HANDLE handle = GetStdHandle (STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition (handle, pos);
} 

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info={1,0}; //第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
} 

int starup()//游戏初始化 
{
	high=20;
	width=25;
	
	bird_x=0;
	bird_y=width/3;
	 
	bar_y=width;
	bar_xtop=high/4;
	bar_xdown=high/2;
	
	score=0;
	
	HideCursor(); //隐藏光标
}

int show()//游戏显示
{	
	gotoxy(0,0);//清屏 
	int i,j;
	for(i=0;i<=high+1;i++)
	{
		for(j=0;j<=width+1;j++)
		{
			if(i==bird_x&&j==bird_y)
				printf("@");     //输出小鸟@ 
			else if((j==bar_y)&& ((i<=bar_xtop)||(i>=bar_xdown)))
				printf("*");      //输出障碍物*	
			else if(j==width+1)    //输出右边框 
				 printf("|");	
			else if(i==high+1)      //输出下边框 
				 printf("_");
			else 
				printf(" ");
		}
		printf("\n");
	}
	printf("得分：%d\n",score);
}

int updataWithoutInput()//与用户输入无关的更新 
{	
	if(bird_y==bar_y)
	{
		if((bird_x>bar_xtop)&&(bird_x<bar_xdown)) //计分 
			score++;
		else //撞障碍失败 
		{
			exit(0); 
		}
	}
	bird_x++;
	
	//触底失败 
	if(bird_x==high+2)
		exit(0);
	
	if(bar_y>0)
		bar_y--;
	else
	{
		bar_y=width;
		
		int randposition=rand()%(high-5);
		 
		bar_xtop=randposition;
		bar_xdown=randposition+high/4;
	}
	
	
	Sleep(100);
}

int updataWithInput()//与用户输入有关的更新 
{
	char input;
	
	if(kbhit())//当按下键时执行
	{
		input=getch(); //不必按回车
		if(input==' ')
		{
			bird_x=bird_x-2;
		} 
	} 
}

int main()
{
	srand((int)time(0));
	starup();//数据初始化
	while(1)//游戏循环 
	{
		show();//游戏显示 
		updataWithoutInput();//与用户输入无关的更新  
		updataWithInput(); //与用户输入有关的更新 
	} 
	return 0; 
} 
